Android 官方文档View解读一

Provides classes that expose basic user interface classes that handle screen layout and interaction with the user

官网关于View是如上概括的,大概意思是提供处理屏幕布局和用户交互界面类的接口。

注解类

  • ViewDebug.CapturedViewProperty:这个注解可以用来标记捕获视图时要转储的字段和方法。带有这个注解的方法必须没有参数,并且必须返回一个有效类型的数据
  • ViewDebug.ExportedProperty:这个注解可以用来标记视图服务器转储的字段和方法。只有没有参数的非void方法才能被这个注解注释掉。
  • ViewDebug.FlagToString:定义从一个标志到一个字符串的映射。这样的映射可以在@ExportedProperty中使用,为最终用户提供更有意义的值。
  • ViewDebug.IntToString:定义从int值到String的映射。这样的映射可以在@ExportedProperty中使用,为最终用户提供更有意义的值。

重点标记的接口

  • CollapsibleActionView:当一个View实现这个接口时,它将在扩展或折叠时作为一个动作视图接收回调,以及可选的,应用程序指定的对MenuItem.OnActionExpandListener的回调。
  • GestureDetector.OnContextClickListener:当context发生点击时回调
  • GestureDetector.OnDoubleTapListener:当双击或者确认单击时回调

View

表示构建用户界面的基础类。在屏幕中是一块用来绘制和处理事件的矩形区域。View是用来创建用户交互界面(按钮、文本框等)组建的基类。ViewGroup子类是布局的基类,它是不可见的容器,用于存放其他视图(或其他视图组),并定义其布局属性。

为了实现一个自定义的视图,你通常会首先提供一些框架在所有视图中调用的标准方法的重写。您不需要覆盖所有这些方法。实际上可以只重写onDraw()方法。下面是一些自定义View时需要了解的方法:

  1. 创建
  • Constructors 构造方法:当从代码创建视图时调用构造函数的一种形式,以及从布局文件xml视图时调用的形式。第二种形式应解析和应用布局文件中定义的任何属性。
  • onFinishInflate():当view和它的子布局都从xml加载出来后回调此方法
  1. 布局
  • onMeasure(int, int):当请求获取view以及它的所有子view的大小时回调
  • onLayout(boolean, int, int, int, int):当view需要给所有的子布局分配空间和设置位置时调用
  • onSizeChanged(int, int, int, int):当view的大小改变时回调
  1. 绘制
  • onDraw(android.graphics.Canvas):当view要呈现其内容时调用
  1. 事件处理
  • onKeyDown(int, KeyEvent):当发生新的硬件按键事件时调用
  • onKeyUp(int, KeyEvent):当发生硬件按键事件时调用
  • onTrackballEvent(MotionEvent):当轨迹球移动事件发生时调用
  • onTouchEvent(MotionEvent):当触摸屏幕事件发生时调用
  1. 焦点
  • onFocusChanged(boolean, int, android.graphics.Rect):当view获取或者失去焦点时调用
  • onWindowFocusChanged(boolean):当包含view的窗体得到或失去焦点时调用
  1. 填充(Attaching)
  • onAttachedToWindow():当view填充到窗体上时调用
  • onDetachedFromWindow():当view从窗体上分离时调用
  • onWindowVisibilityChanged(int):当包含view的窗体显隐状态发生改变时调用

    Position

  • ViewgetLeft()getRight()getTop()getBottom()
  • ViewgetY()getTranslationY()getTop() 之间的联系
  • ViewgetScroolYViewscrollTo()scrollBy()
  • event.getY()event.getRawY()

先来看个截图:

screen.png

最大的草绿色区域时屏幕界面,红色次大的区域我们称之为“应用界面区域”。屏幕顶端,应用界面之外的区域含有运营商,电池时间等称之为“状态栏”。一般应用界面会含有标题栏也就是紫色标记的区域。

1
2
3
4
View.getLeft()
View.getRight()
View.getTop()
View.getBottom()

这四个方法是获取View针对其直接父布局的左上角和右下角的的坐标。View.getLeft()是左上角的x坐标,View.getTop()是左上角的Y坐标。。View.getRight()是右下角的x坐标,View.getBottom()是右下角的Y坐标。

举个例子:求标题栏的lefttoprightbottom。相对于它的直接父布局为红色应用区域,红色区域左上角为坐标系原点。以actionBar和180*800的屏幕为例,actionBar高度为58px则左上角,右下角的坐标分别为(0,0)(480,58)

ViewgetLeft()getTranslationX()getTop()getTranslationY()之间的关系如下:

1
2
3
4
5
//getTanslationX()默认为零,产生X轴方向偏移时有值
getLeft()=getX()+getTanslationX();
//同上,getTanslationY()默认为零,产生Y轴方向偏移时有值
getTop()=getY()+getTanslationY();